package Day_0201.JUC;

/**
 * @author zxc
 * @date 2023/02/01 16:18
 **/
public class Thread_safety {
    public static void main(String[] args) {
        /**
         * 线程安全的含义
         * 1.概念 ：
         * 线程安全就是说多线程访问同一段代码，不会产生不确定的结果。
         * （即，线程安全就是某段代码在单线程 && 多线程（高并发）情况下，执行所得到的结果是一致的;）
         * ===》 通俗易懂地来说，如果代码在多线程下执行和在单线程下执行永远都能获得一样的结果，那么代码就是线程安全的。
         *
         * 2.线程安全级别 ：
         * （1）不可变 :
         *  ===> final关键字所修饰的变量，任何线程都无法改变其值;
         *  像String、Integer、Long这些，都是final类型的类，任何一个线程都改变不了它们的值，要改变除非新创建一个，
         *  因此这些不可变对象不需要任何同步手段就可以直接在多线程环境下使用;
         *
         * （2）绝对线程安全
         *  不管运行时环境如何，调用者都不需要额外的同步措施。
         *  要做到这一点通常需要付出许多额外的代价，Java中标注自己是线程安全的类，实际上绝大多数都不是线程安全的，
         *  不过绝对线程安全的类，Java中也有，比方说CopyOnWriteArrayList、CopyOnWriteArraySet
         *
         * （3）相对线程安全
         *  相对线程安全也就是我们通常意义上所说的线程安全;
         *  像Vector这种，add、remove方法都是原子操作，不会被打断;
         *  如果有个线程在遍历某个Vector、有个线程同时在add这个Vector，会出现ConcurrentModificationException，也就是fail-fast机制。
         *  ===> fail-fast机制 ：即，对于集合类Collection来说，若是多个线程同时操作同一个集合的话，会抛出异常;
         *
         * （4）线程非安全
         *  ArrayList、LinkedList、HashMap等都是线程非安全的类
         */

        /**
         * 线程安全所要保证的基本特征：
         * ===》
         * 1.原子性，
         * 简单说就是相关操作不会中途被其他线程干扰，一般通过同步机制实现。
         *
         * 2.可见性，
         * 是一个线程修改了某个共享变量，其状态能够立即被其他线程知晓，通常被解释为将线程本地状态反映到主内存上，volatile 就是负责保证可见性的。
         *
         * 3.有序性，
         * 是保证线程内串行语义，避免指令重排等。
         *
         * 总结 ：
         * 要想保证线程安全的话，则需要满足：
         * （1）原子性 ：即，某个线程在操作共享资源的过程中不被其他线程所影响;（同步机制，实现原子性）
         * （2）可见性 ：即，某个线程修改了共享变量值，需要使得其他线程能够知道该共享变量被修改;（volatile关键字实现可见性）;
         * （3）有序性 ：即，避免指令重排;
         */
    }
}
